// let

//用来替代 var 的

// var 有两个不足
// 1.var会出现变量的提升
// 2.var没有块级作用域

// 1. let 声明的全局变量不是window的属性
var a=1;
console.log(window.a);//直接是undefined  环境问题
                      //控制台输出  1
let b=2;
console.log(window.b); //undefined

// 2. 不允许重复声明

var c=1;
// let c=4;//Identifier 'c' has already been declared 

// 3. let 声明的全局变量不存在变量的提升

function fn1(){
    console.log(d); //undefined
    var d=1 //变量出现了提升的现象
}
fn1() 
// 可以理解为：
function fn2(){
    var e
    console.log(e); //undefined
    e=3 //变量出现了提升的现象
}
fn2() 
// undefined（未定义）的情况有两种
// 1.直接没有定义 变量不存在
// 2.定义变量 却没有赋值

function fn3(){
    console.log(d);//直接是undefined  环境问题
                     //控制台输出 VM12958:1 Uncaught ReferenceError: d is not defined
    let d=1
}

fn3()

// 结论：使用let必须先声明再使用

// 4. let 声明的变量拥有块级作用域

{
    let q=1
}
// console.log(q);//let.js?5346:54 Uncaught ReferenceError: q is not defined

for(var i=1;i<=3;i++){
    // console.log(i);//1,2,3
}
console.log(i);//4

for(let j=1;j<=3;j++){
    // console.log(j);//1,2,3
}
// console.log(j);//Uncaught ReferenceError: j is not defined

for(var i = 1; i <= 3; i++) {
    setTimeout(function(){
        // console.log(i); //4
    }, 1000);
}
for(let i = 1; i <= 3; i++) {
    setTimeout(function(){
        // console.log(i); 
    }, 1000);
}
for (var i=1; i<=3; i++) {(
    function(j) {
        setTimeout( function () {
            // console.log( j );
        }, 1000 );
    })(i);
}
function timer(i) {
    setTimeout( console.log( i ), i*1000 );
}
for (var i=1; i<=5;i++) {
    timer(i);
}